/**
 * @(#) CelebrationProxy.as
 *
 * @date		2009. 03. 19.
 * @version		1.0
 * @author		Park, Juneho
 * @description	 경조사 Proxy - Proxy
 * 				경조사 조회를한다.
 */
package com.skt.common_hr.congmoney2.model
{
	import com.skt.common_hr.common.puremvc.CommonProxy;
	import com.skt.common_hr.congmoney2.CongMoney2Facade;
	import com.skt.common_hr.congmoney2.model.vo.CongMoneyVO;
	import com.skt.common_hr.congmoney2.model.vo.CongMoneyWriteVO;
	import com.wcl.dataloader.*;
	import com.wcl.utils.DateUtil;
	import com.wcl.utils.StringUtil;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
		
	public class CelebrationProxy extends CommonProxy
	{
		public static const NAME:String = "CelebrationProxy";
		
		public var celebrationList:ArrayCollection;
		public var detailVO:CongMoneyWriteVO;
		public var key:String;
		public var printDataVO:CongMoneyWriteVO;
		//경조사유
		public var congCorsn:ArrayCollection;
		
		//지원기준
		public var loadFaultMessage:String;
		
		/**
		 * 생성자
		 * 
		 * @param
		 * @return void
		 */
		public function CelebrationProxy(data:Object=null)
		{
			super(NAME, data); 
		}
		
		
		
		/**
		 * data load를 수행
		 * 		- DataLoader 를 생성하고 Import Parameter 객체를 생성, RFC를 호출
		 * 
		 * @param pernr 사번
		 * @return void
		 */
		public function loadList(pernr:String):void
		{
			var params:Object = new Object();
			params["I_PERNR"] = pernr;
			
			loadData("Z_HR_0045", params, listResult, listFault);
		}
		
		public function loadDetail(gwarekey:String):void
		{
			//Alert.show('CelebrationProxy.as loadDetail : ' + gwarekey);//silver
			var params:Object = new Object;
			params["I_GWAREKEY"] = gwarekey;
			trace(gwarekey);
			loadData("Z_HR_0047", params, detailResult, detailFault);
		}
		
		//경조사입력
		public function save(gwarekey:String, vo:CongMoneyWriteVO, validate:Boolean=false):void
		{
			var params:Object = new Object();
			params["I_GWAREKEY"] = (gwarekey == null) ? "" : gwarekey;
			params["I_REQUEST"] = validate ? "X" : "";
			
			params["I_ADMIN_COMM"] = validate ? "E" : "S";	//저장은 S, 완료저장은 E
			
			
			var tables:Object = new Object();
			var table:Array = new Array();
			table.push(toJsonType(vo));
			tables["ITAB"] = table;
			saveData("Z_HR_0046", params, tables, saveResult, saveFault);
		}
		
		
		/**
		 * data load를 수행
		 * 		- DataLoader 를 생성하고 Import Parameter 객체를 생성, RFC를 호출
		 * 
		 * @param pernr 사번
		 * @return void
		 */
		public function deleteData(gwKey:String, wstatus:String):void
		{
			var params:Object = new Object();
			params["I_GWAREKEY"] = gwKey;
			params["I_WSTATUS"] = wstatus;
			
			loadData("Z_HR_0048", params, deleteResult, deleteFault);
		}
		
		public function printData(gwKey:String):void
		{
			var params:Object = new Object();
			params["I_GWAREKEY"] = gwKey;
			
			loadData("Z_HR_0047", params, printResult, printFault);
		}
		
		
		//경조사유
		public function corsnLoad(corsn:String):void
		{
			var param:Object = new Object();
			param["I_COGBN"] = corsn;
			
			loadData("Z_HR_0044", param, corsnResult, corsnFault);
		}
		
		
		///////////////////////////////////////////////////////////////////////////////////////////////////
		//
		//	Event Listeners
		//
		///////////////////////////////////////////////////////////////////////////////////////////////////
		/**
		 * 경조금 신청 리스트가 정상적으로 로드되었을  때 처리
		 * 
		 * @param
		 * @return void
		 */
		public function listResult(event:ResultEvent):void
		{
			if(retCode==0) {  
				celebrationList = parseCelebrationList(event.result.FTAB);
				facade.sendNotification(CongMoney2Facade.LOAD_CELEBRATION_LIST_COMPLETE, this);
			}
			else {
				facade.sendNotification(CongMoney2Facade.LOAD_CELEBRATION_LIST_FAILED, this);
			}
		}
		
		/**
		 * 경조금 신청 리스트가 실패 했을 때 처리
		 * 
		 * @param
		 * @return void
		 */
		private function listFault(event:FaultEvent):void
		{
			facade.sendNotification(CongMoney2Facade.LOAD_CELEBRATION_LIST_FAILED, this);
		}
		
		
		
		/**
		 * 경조금 신청 상세정보가 정상적으로 조회됨
		 * 
		 * @param
		 * @return void
		 */
		public function detailResult(event:ResultEvent):void
		{
			if(retCode==0 && event.result.ITAB.length>0) {
				detailVO = parseSelectedList(event.result.ITAB); 
				facade.sendNotification(CongMoney2Facade.LOAD_CELEBRATION_MODIFY_DETAIL_COMPLETE, this);
			}
			else {
				detailVO = null;
				facade.sendNotification(CongMoney2Facade.LOAD_CELEBRATION_DETAIL_FAILED, this);
			}
		}
		
		/**
		 * 경조금 신청 상세 정보 조회중 오류
		 * 
		 * @param
		 * @return void
		 */
		private function detailFault(event:FaultEvent):void
		{
			//Alert.show('detailFault');//silver
			detailVO = null;
			facade.sendNotification(CongMoney2Facade.LOAD_CELEBRATION_DETAIL_FAILED, this);
		}


		/**
		 * 서버에서 정상적으로 리턴된 결과를 처리
		 * 		- 경조사입력
		 * @param
		 * @return void
		 */
		public function saveResult(event:ResultEvent):void
		{
			
			if(retCode==0) {  
				//congCorsn = parseCorsn(event.result.FTAB);
				key = event.result["O_GWAREKEY"];
				facade.sendNotification(CongMoney2Facade.SAVE_CELEBRATION_COMPLETE, this);
			}
			else {
				/*
				trace( "failed to load cong: (" +event.result["RETCODE"] + ") "+event.result["RETTEXT"]);
				if(event.result["RETCODE"] == 1 || event.result["RETCODE"] == 2){ //다른 경조휴가 조회됨
					saveErroryMessage = event.result["RETTEXT"];
				} else if(event.result["RETCODE"] == 3){ //다른근태조회(결재중/결재완료)
					saveErroryMessage = "휴가 일이 중복되었습니다. 다시 입력하세요.";
				} else if(event.result["RETCODE"] == 4){ //경조 휴가 신청일 입력 오류
					saveErroryMessage = "경조휴가 신청 날짜를 다시 입력하세요."
				} else if(event.result["RETCODE"] == 5){ //다른 경조휴가 조회됨
					saveErroryMessage = "다른 경조 휴가일과 중복되었습니다. \n 다시입력하세요.";
				} else if(event.result["RETCODE"] > 5) {
					saveErroryMessage = event.result["RETTEXT"];
				}
				*/
				facade.sendNotification(CongMoney2Facade.SAVE_CELEBRATION_FAILED, this);
			}
		}
		
		/**
		 * 서버에서 오류가 발생했을 처리
		 * 		- 경조사입력
		 * @param
		 * @return void
		 */
		private function saveFault(event:FaultEvent):void
		{
			facade.sendNotification(CongMoney2Facade.SAVE_CELEBRATION_FAILED, this);
		}

		public function deleteResult(event:ResultEvent):void
		{
			if(retCode==0) {
				facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_DELETE_COMPLETE, this);
			}
			else {
				facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_DELETE_FAILED, this);
			}
		}
		
		private function deleteFault(event:FaultEvent):void
		{
			facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_DELETE_FAILED, this);
		}
		
		public function printResult(event:ResultEvent):void
		{
			if(retCode==0) {  				
				printDataVO = parseSelectedList(event.result.ITAB);
				facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_PRINT_COMPLETE, this);
			}
			else {
				facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_PRINT_FAILED, this);
			}
		}
		
		private function printFault(event:FaultEvent):void
		{
			facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_PRINT_FAILED, this);
		}
		
		
		public function corsnResult(event:ResultEvent):void
		{
			if(retCode==0) {  
				congCorsn = parseCorsn(event.result.FTAB);
				facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_CORSNVIEW_COMPLETE, this);
			}
			else {
				facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_CORSNVIEW_FAILED, this);
			}
		}
		
		private function corsnFault(event:FaultEvent):void
		{
			facade.sendNotification(CongMoney2Facade.LOAD_CONGMONEY_CORSNVIEW_FAILED, this);
		}
		
		///////////////////////////////////////////////////////////////////////////////////////////////////
		//
		//	Data Parsing functions
		//
		///////////////////////////////////////////////////////////////////////////////////////////////////
		/**
		 * 서버에서 전달된 result 객체를 분석하여 Value Object를 생성
		 * 
		 * @param
		 * @return 경조사조회 현황 ArrayCollection
		 */
		private function parseCelebrationList(srcArr:ArrayCollection):ArrayCollection
		{
			var retArr:ArrayCollection = new ArrayCollection();
			
			for each(var rec:Object in srcArr) 
			{
				var vo:CongMoneyVO = new CongMoneyVO();
				
				vo.GWAREKEY		= rec["GWAREKEY"];		//Groupware 전자결재 Key
				vo.IDATE		= DateUtil.stringToDateTime(rec["IDATE"]);			//신청일
				vo.CODAT		= DateUtil.stringToDateTime(rec["CODAT"]);			//경조발생일
				vo.CORSN		= rec["CORSN"];			//경조사유 코드
				vo.ZTEXT		= rec["ZTEXT"];			//경조내역
				vo.CPERNR		= rec["CPERNR"];		//경조대상자 사원 번호
				vo.CNAME		= rec["CNAME"];			//대상자이름
				vo.BNKSA		= rec["BNKSA"];			//은행 계정 정보 레코드 유형
				vo.STEXT		= rec["STEXT"];			//계좌구분
				vo.WSTATUS		= rec["WSTATUS"];		//결재진행상태
				vo.WSTATX		= rec["WSTATX"];		//결재진행상태텍스트
				vo.BSTATUS		= rec["BSTATUS"];		//전표진행상태
				vo.BSTATX		= rec["BSTATX"];		//전표진행상태
				
				retArr.addItem(vo);
			}
			return retArr;	
		}
		
		
		/**
		 * 서버에서 전달된 result 객체를 분석하여 Value Object를 생성
		 * 
		 * @param
		 * @return 경조사조회 현황 ArrayCollection
		 */
		private function parseSelectedList(recArr:ArrayCollection):CongMoneyWriteVO
		{
			//Alert.show('parseSelectedList');
			for each(var obj:Object in recArr){
				var vo:CongMoneyWriteVO = new CongMoneyWriteVO();
				
				vo.GWAREKEY		= obj.GWAREKEY;			//Groupware 전자결재 Key
				vo.CPERNR		= StringUtil.trimFront(obj.CPERNR,"0");//경조대상자 사원 번호
				vo.CNAME		= obj.CNAME;			//대상자이름
				vo.ORGTX		= obj.ORGTX;			//ORGTX
				vo.CODAT		= DateUtil.stringToDateTime(obj.CODAT); 			//경조발생일
				vo.CORSN		= obj.CORSN;			//경조사유 코드
				vo.ZTEXT		= obj.ZTEXT;			//경조내역
				vo.COPER		= obj.COPER;			//사유발생자
				vo.COREG		= vo.getPid(obj.COREG);			//주민등록번호 (한국)
				
				vo.FAMILY		= obj.FAMILY;			//가족코드
				vo.FTEXT		= obj.FTEXT;			//경조 가족관계 텍스트
				var object:Object = new Object();
				//object.BETRG = obj.WAERS != 'KRW' ? obj.BETRG : obj.BETRG;
				object.BETRG	= obj.BETRG;
				vo.BETRG		= object.BETRG;				//HR 급여관리: 금액
				
				//vo.BETRG		= obj.BETRG;			//HR 급여관리: 금액
				vo.WAERS		= obj.WAERS;			//통화 키
				vo.BANKL		= obj.BANKL;			//은행 키
				vo.BANKA		= obj.BANKA;			//은행 이름
				vo.BNKSA		= obj.BNKSA;			//은행 계정 정보 레코드 유형
				
				vo.BUKRS		= obj.BUKRS;			//회사코드
				
				vo.STEXT		= obj.STEXT;			//하위 유형 이름
				vo.BANKN		= obj.BANKN;			//은행 계정 번호
				vo.EMFTX		= obj.EMFTX;			//예금주 텍스트
				vo.COSEL		= obj.COSEL;			//경조휴가신청여부
				vo.COBEG		= DateUtil.stringToDateTime(obj.COBEG); 			//경조휴가시작일
				vo.COEND		= DateUtil.stringToDateTime(obj.COEND); 			//경조휴가종료일
				vo.CODYS		= obj.CODYS;			//경조휴가일수
				vo.ZWRTH		= obj.ZWRTH;			//화환 지급여부
				vo.ZWRSP		= obj.ZWRSP;			//화환선지급여부
				vo.PLACE		= obj.PLACE;			//배송처
				vo.REPER		= obj.REPER;			//받는사람
				vo.CNNCT		= obj.CNNCT;			//연락처
				vo.SNDAT		= obj.SNDAT;			//배송일
				vo.ETCTX		= obj.ETCTX;			//비고
				vo.IPERNR		= StringUtil.trimFront(obj.IPERNR,"0");//신청인 사원 번호
				vo.INAME		= obj.INAME;			//신청자이름
				vo.IDATE		= DateUtil.stringToDateTime(obj.IDATE); 			//신청일
				vo.WPERNR		= StringUtil.trimFront(obj.WPERNR,"0");			//결재자 사원 번호
				vo.WNAME		= obj.WNAME;			//결재자이름
				vo.WSTATUS		= obj.WSTATUS;			//결재진행상태
				vo.WSTATX		= obj.WSTATX;			//결재진행상태명
				vo.BSTATUS		= obj.BSTATUS;			//전표진행상태
				vo.BSTATX		= obj.BSTATX;			//결재진행상태명
				vo.BELNR		= obj.BELNR;			//전표번호
				vo.ZFNR			= obj.ZFNR;
				var iday:Date = DateUtil.stringToDateTime(obj.IDATE);
				
				if(iday.day == 1) {
					vo.IDAY = "월";
				} else if(iday.day == 2) {
					vo.IDAY = "화";
				} else if(iday.day == 3) {
					vo.IDAY = "수";
				} else if(iday.day == 4) {
					vo.IDAY = "목";
				} else if(iday.day == 5) {
					vo.IDAY = "금";
				} else if(iday.day == 6) {
					vo.IDAY = "토";
				} else if(iday.day == 0) {
					vo.IDAY = "일";
				}
				vo.PRINT_IDATE		= DateUtil.stringToDateTime(obj.IDATE); //프린트용신청일
				vo.PRINT_CODAT		= DateUtil.stringToDateTime(obj.CODAT);
			}
			return vo;	
		}
		
		// JSON에 적용하기 위해 Import필드 중에서 Date Type을 String으로 변환한다.
		private function toJsonType(vo:CongMoneyWriteVO):Object {
			var paramObj:Object = new Object();
			
			paramObj.GWAREKEY		= vo.GWAREKEY;			//Groupware 전자결재 Key
			paramObj.CPERNR		= vo.CPERNR;//경조대상자 사원 번호
			paramObj.CNAME		= vo.CNAME;			//대상자이름
			paramObj.ORGTX		= vo.ORGTX;			//ORGTX
			paramObj.CODAT		= DateUtil.toBasicString(vo.CODAT); 			//경조발생일
			paramObj.CORSN		= vo.CORSN;			//경조사유 코드
			paramObj.ZTEXT		= vo.ZTEXT;			//경조내역
			paramObj.COPER		= vo.COPER;			//사유발생자
			paramObj.COREG		= vo.COREG.substring(0,6) + vo.COREG.substring(7);			//주민등록번호 (한국)
			paramObj.FAMILY		= vo.FAMILY;			//가족코드
			paramObj.FTEXT		= vo.FTEXT;			//경조 가족관계 텍스트
			paramObj.BETRG		= vo.BETRG;				//HR 급여관리: 금액
			paramObj.WAERS		= vo.WAERS;			//통화 키
			paramObj.BANKL		= vo.BANKL;			//은행 키
			paramObj.BANKA		= vo.BANKA;			//은행 이름
			paramObj.BNKSA		= vo.BNKSA;			//은행 계정 정보 레코드 유형
			paramObj.STEXT		= vo.STEXT;			//하위 유형 이름
			paramObj.BANKN		= vo.BANKN;			//은행 계정 번호
			paramObj.EMFTX		= vo.EMFTX;			//예금주 텍스트
			paramObj.COSEL		= vo.COSEL;			//경조휴가신청여부
			
			paramObj.BUKRS		= vo.BUKRS;			//회사코드
			
			if(vo.COSEL == "X") {
				paramObj.COBEG		= DateUtil.toBasicString(vo.COBEG); 			//경조휴가시작일
				paramObj.COEND		= DateUtil.toBasicString(vo.COEND); 			//경조휴가종료일
				paramObj.CODYS		= vo.CODYS;			//경조휴가일수
			}
			else {
				paramObj.COBEG		= ""; 			//경조휴가시작일
				paramObj.COEND		= ""; 			//경조휴가종료일
				paramObj.CODYS		= "";			//경조휴가일수
			}
			paramObj.ZWRTH		= vo.ZWRTH;			//화환 지급여부
			paramObj.ZWRSP		= vo.ZWRSP;			//화환선지급여부
			paramObj.PLACE		= vo.PLACE;			//배송처
			paramObj.REPER		= vo.REPER;			//받는사람
			paramObj.CNNCT		= vo.CNNCT;			//연락처
			paramObj.SNDAT		= vo.SNDAT;			//배송일
			paramObj.ETCTX		= vo.ETCTX;								//비고
			paramObj.IPERNR		= vo.IPERNR;		//신청인 사원 번호
			paramObj.INAME		= vo.INAME;			//신청자이름
			paramObj.IDATE		= DateUtil.toBasicString(vo.IDATE); 			//신청일
			paramObj.WPERNR		= vo.WPERNR;			//결재자 사원 번호
			paramObj.WNAME		= vo.WNAME;			//결재자이름
			paramObj.WSTATUS		= vo.WSTATUS;			//결재진행상태
			paramObj.WSTATX		= vo.WSTATX;			//결재진행상태명
			paramObj.BSTATUS		= vo.BSTATUS;			//전표진행상태
			paramObj.BSTATX		= vo.BSTATX;			//결재진행상태명
			paramObj.BELNR		= vo.BELNR;			//전표번호
			paramObj.ZFNR 		= vo.ZFNR;
			paramObj.PRINT_IDATE = DateUtil.toBasicString(vo.IDATE); //프린트용신청일
			paramObj.PRINT_CODAT = DateUtil.toBasicString(vo.CODAT);
			return paramObj;
		}
		
		/**
		 * 서버에서 전달된 result 객체를 분석하여 Value Object를 생성
		 * 
		 * @param ArrayCollection
		 * @return 경조사유 ArrayCollection
		 */
		private function parseCorsn(srcArr:ArrayCollection):ArrayCollection
		{
			var retArr:ArrayCollection = new ArrayCollection();
			
			for each(var rec:Object in srcArr) 
			{
				retArr.addItem({label:rec["ZTEXT"], data:rec["CORSN"]});
			}
			return retArr;	
		}
	}
}